[IA64] Enable PV domain debugging.
authorAlex Williamson <alex.williamson@hp.com>
Fri, 22 Jun 2007 17:44:44 +0000 (11:44 -0600)
committerAlex Williamson <alex.williamson@hp.com>
Fri, 22 Jun 2007 17:44:44 +0000 (11:44 -0600)
Signed-off-by: Tristan Gingold <tgingold@free.fr>
xen/arch/ia64/xen/faults.c
xen/include/asm-ia64/debugger.h
xen/include/asm-ia64/linux-xen/asm/ptrace.h

index 7528d2e0cae53bd3ea0e8a74c660bdabbec0047a..63be84df2f2fbd84bcb7b7bee5c45f588dfee106 100644 (file)
@@ -647,6 +647,11 @@ ia64_handle_reflection(unsigned long ifa, struct pt_regs *regs,
                PSCB(current, iim) = iim;
                vector = IA64_SPECULATION_VECTOR;
                break;
+       case 29:
+               vector = IA64_DEBUG_VECTOR;
+               if (debugger_trap_entry(vector,regs))
+                       return;
+               break;
        case 30:
                // FIXME: Should we handle unaligned refs in Xen??
                vector = IA64_UNALIGNED_REF_VECTOR;
@@ -681,19 +686,19 @@ ia64_handle_reflection(unsigned long ifa, struct pt_regs *regs,
                vector = IA64_LOWERPRIV_TRANSFER_TRAP_VECTOR;
                break;
        case 35:
-               printk("ia64_handle_reflection: handling taken branch trap\n");
                vector = IA64_TAKEN_BRANCH_TRAP_VECTOR;
+               if (debugger_trap_entry(vector,regs))
+                       return;
                break;
        case 36:
-               printk("ia64_handle_reflection: handling single step trap\n");
                vector = IA64_SINGLE_STEP_TRAP_VECTOR;
+               if (debugger_trap_entry(vector,regs))
+                       return;
                break;
 
        default:
-               printk("ia64_handle_reflection: unhandled vector=0x%lx\n",
-                      vector);
-               while (vector)
-                       /* spin */;
+               panic_domain(regs, "ia64_handle_reflection: "
+                            "unhandled vector=0x%lx\n", vector);
                return;
        }
        if (check_lazy_cover && (isr & IA64_ISR_IR) &&
index 3e6a51d2e4855b89811bc3be9657a6929aa1f6c5..747e5a79cfff7a22003300fdca40f555c8984a8a 100644 (file)
@@ -56,13 +56,6 @@ show_execution_state(struct cpu_user_regs *regs)
 #ifdef CRASH_DEBUG
 // crash_debug=y
 
-/* The main trap handlers use these helper macros which include early bail. */
-static inline int debugger_trap_entry(
-    unsigned int vector, struct cpu_user_regs *regs)
-{
-    return 0;
-}
-
 extern int __trap_to_cdb(struct cpu_user_regs *r);
 static inline int debugger_trap_fatal(
     unsigned int vector, struct cpu_user_regs *regs)
@@ -80,16 +73,7 @@ static inline int debugger_trap_fatal(
 #define smp_send_stop()        /* nothing */
 #endif
 
-#elif defined DOMU_DEBUG
-// domu_debug=y
-#warning "domu_debug is not implemented yet."
-/* The main trap handlers use these helper macros which include early bail. */
-static inline int debugger_trap_entry(
-    unsigned int vector, struct cpu_user_regs *regs)
-{
-    return 0;
-}
-
+#else
 static inline int debugger_trap_fatal(
     unsigned int vector, struct cpu_user_regs *regs)
 {
@@ -97,22 +81,21 @@ static inline int debugger_trap_fatal(
 }
 
 #define debugger_trap_immediate()              ((void)0)
-#else
-/* The main trap handlers use these helper macros which include early bail. */
+#endif
+
 static inline int debugger_trap_entry(
     unsigned int vector, struct cpu_user_regs *regs)
 {
-    return 0;
-}
+    struct vcpu *v = current;
+
+    if (guest_kernel_mode(regs) && v->domain->debugger_attached) {
+        domain_pause_for_debugger();
+        return 1;
+    }
 
-static inline int debugger_trap_fatal(
-    unsigned int vector, struct cpu_user_regs *regs)
-{
     return 0;
 }
 
-#define debugger_trap_immediate()              ((void)0)
-#endif
 #endif // __ASSEMBLLY__
 
 #endif /* __ASM_DEBUGGER_H__ */
index c63da0a5f99ad72c18418f6549f1973121f3a693..d38f4e93909d2e06aea80cb3cf9a59a00d1a1d2c 100644 (file)
@@ -267,6 +267,7 @@ struct switch_stack {
 # define ia64_psr(regs)                        ((struct ia64_psr *) &(regs)->cr_ipsr)
 #ifdef XEN
 # define guest_mode(regs)              (ia64_psr(regs)->cpl != 0)
+# define guest_kernel_mode(regs)       (ia64_psr(regs)->cpl == 2)
 #else
 # define user_mode(regs)               (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0)
 #endif